package com.bobi.utils;

import com.bobi.entity.Staff;
import com.bobi.enums.SecurityEnum;
import com.bobi.properties.JWTTokenProperties;
import com.google.gson.Gson;
import io.jsonwebtoken.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * TokenUtil
 *
 * @author Chopper
 * @version v1.0
 * 2020-11-12 18:44
 */
@Component
public class TokenUtil {
    @Autowired
    private JWTTokenProperties tokenProperties;
    // @Autowired
    // private Cache cache;

    /**
     * 构建token
     *
     * @param staff 私有声明
     * @return TOKEN
     */
    public Token createToken(Staff staff) {
        Token token = new Token();
        //访问token
        String accessToken = createToken(staff, tokenProperties.getTokenExpireTime());
        token.setAccessToken(accessToken);
        return token;
    }

    /**
     * 生成token
     *
     * @param staff       jwt主体对象
     * @param expirationTime 过期时间（分钟）
     * @return token字符串
     */
    private String createToken(Staff staff, Long expirationTime) {
        //JWT 生成
        return Jwts.builder()
                //jwt 私有声明
                .claim(SecurityEnum.USER_CONTEXT.getValue(), new Gson().toJson(staff))
                //JWT的主体
                .setSubject(staff.getName())
                //失效时间 当前时间+过期分钟
                .setExpiration(new Date(System.currentTimeMillis() + expirationTime * 60 * 1000))
                //签名算法和密钥
                .signWith(SecretKeyUtil.generalKey())
                .compact();
    }
}
